package com.zmn.oms.third.base.util;

import com.zmn.oms.common.constant.OrderConsts;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 类描述：
 *
 * @author LiangHailong
 * @date 2019/10/08 16:01
 */
public final class ProductIdUtil {

    /**
     * 新旧产品映射
     */
    private static final Map<String, Integer> PRODUCT_ID_MAPPING;
    static {
        Map<String, Integer> map = new HashMap<>(372);
        map.put("10007", 10006);
        map.put("10009", 10008);
        map.put("10014", 10702);
        map.put("10015", 10016);
        map.put("10017", 10018);
        map.put("10020", 10710);
        map.put("10026", 10025);
        map.put("10027", 10728);
        map.put("10028", 10730);
        map.put("10029", 10733);
        map.put("10030", 10521);
        map.put("10031", 10531);
        map.put("10033", 10549);
        map.put("10034", 10541);
        map.put("10035", 10543);
        map.put("10037", 10036);
        map.put("10038", 10036);
        map.put("10040", 10039);
        map.put("10048", 10577);
        map.put("10053", 10569);
        map.put("10054", 10598);
        map.put("10055", 10752);
        map.put("10056", 10753);
        map.put("10057", 10754);
        map.put("10060", 10755);
        map.put("10063", 10584);
        map.put("10064", 10585);
        map.put("10072", 10071);
        map.put("10075", 10074);
        map.put("10077", 10076);
        map.put("10079", 10078);
        map.put("10080", 10008);
        map.put("10087", 10085);
        map.put("10089", 10076);
        map.put("10100", 10089);
        map.put("10107", 10105);
        map.put("10117", 10089);
        map.put("10140", 10307);
        map.put("10142", 10309);
        map.put("10144", 10291);
        map.put("10157", 10153);
        map.put("10172", 10158);
        map.put("10174", 10176);
        map.put("10175", 10176);
        map.put("10177", 10176);
        map.put("10179", 10322);
        map.put("10192", 10193);
        map.put("10196", 10204);
        map.put("10205", 10204);
        map.put("10212", 10211);
        map.put("10214", 10213);
        map.put("10215", 10213);
        map.put("10216", 10213);
        map.put("10217", 10213);
        map.put("10218", 10213);
        map.put("10219", 10213);
        map.put("10220", 10213);
        map.put("10259", 10322);
        map.put("10260", 10322);
        map.put("10261", 10322);
        map.put("10262", 10322);
        map.put("10263", 10322);
        map.put("10264", 10322);
        map.put("10265", 10322);
        map.put("10266", 10147);
        map.put("10272", 10006);
        map.put("10274", 10085);
        map.put("10275", 10756);
        map.put("10277", 10068);
        map.put("10278", 10541);
        map.put("10280", 10008);
        map.put("10282", 10731);
        map.put("10283", 10076);
        map.put("10284", 10076);
        map.put("10286", 10754);
        map.put("10287", 10585);
        map.put("10289", 10158);
        map.put("10293", 10326);
        map.put("10294", 10326);
        map.put("10295", 10326);
        map.put("10296", 10326);
        map.put("10297", 10326);
        map.put("10298", 10326);
        map.put("10299", 10326);
        map.put("10300", 10326);
        map.put("10301", 10326);
        map.put("10302", 10326);
        map.put("10303", 10326);
        map.put("10304", 10326);
        map.put("10305", 10326);
        map.put("10306", 10013);
        map.put("10308", 10141);
        map.put("10312", 10311);
        map.put("10323", 10326);
        map.put("10328", 10326);
        map.put("10329", 10326);
        map.put("10330", 10326);
        map.put("10332", 10326);
        map.put("10333", 10326);
        map.put("10334", 10326);
        map.put("10337", 10326);
        map.put("10339", 10013);
        map.put("10340", 10013);
        map.put("10341", 10013);
        map.put("10342", 10013);
        map.put("10343", 10013);
        map.put("10344", 10013);
        map.put("10345", 10013);
        map.put("10367", 10013);
        map.put("10368", 10013);
        map.put("10369", 10013);
        map.put("10370", 10013);
        map.put("10371", 10013);
        map.put("10372", 10013);
        map.put("10373", 10013);
        map.put("10374", 10013);
        map.put("10375", 10147);
        map.put("10376", 10147);
        map.put("10377", 10733);
        map.put("10378", 10733);
        map.put("10383", 10379);
        map.put("10384", 10380);
        map.put("10385", 10381);
        map.put("10387", 10388);
        map.put("10390", 10388);
        map.put("10391", 10388);
        map.put("10392", 10388);
        map.put("10394", 10388);
        map.put("10396", 10388);
        map.put("10397", 10388);
        map.put("10398", 10388);
        map.put("10400", 10388);
        map.put("10402", 10388);
        map.put("10403", 10388);
        map.put("10404", 10388);
        map.put("10405", 10401);
        map.put("10406", 10401);
        map.put("10407", 10409);
        map.put("10408", 10409);
        map.put("10410", 10409);
        map.put("10411", 10409);
        map.put("10412", 10409);
        map.put("10414", 10413);
        map.put("10415", 10413);
        map.put("10416", 10417);
        map.put("10418", 10423);
        map.put("10419", 10409);
        map.put("10420", 10409);
        map.put("10422", 10423);
        map.put("10424", 10423);
        map.put("10429", 10475);
        map.put("10431", 10475);
        map.put("10433", 10728);
        map.put("10434", 10010);
        map.put("10435", 10010);
        map.put("10436", 10475);
        map.put("10437", 10475);
        map.put("10455", 10001);
        map.put("10456", 10001);
        map.put("10457", 10004);
        map.put("10458", 10004);
        map.put("10459", 10003);
        map.put("10460", 10003);
        map.put("10461", 10005);
        map.put("10462", 10005);
        map.put("10463", 10006);
        map.put("10464", 10006);
        map.put("10466", 10007);
        map.put("10467", 10007);
        map.put("10480", 10702);
        map.put("10481", 10702);
        map.put("10482", 10702);
        map.put("10483", 10702);
        map.put("10484", 10016);
        map.put("10485", 10016);
        map.put("10486", 10016);
        map.put("10487", 10016);
        map.put("10488", 10016);
        map.put("10489", 10016);
        map.put("10490", 10018);
        map.put("10491", 10018);
        map.put("10492", 10019);
        map.put("10493", 10019);
        map.put("10494", 10019);
        map.put("10495", 10019);
        map.put("10496", 10019);
        map.put("10497", 10019);
        map.put("10498", 10021);
        map.put("10499", 10021);
        map.put("10500", 10021);
        map.put("10501", 10021);
        map.put("10502", 10021);
        map.put("10503", 10022);
        map.put("10504", 10022);
        map.put("10505", 10022);
        map.put("10506", 10022);
        map.put("10507", 10022);
        map.put("10508", 10023);
        map.put("10509", 10023);
        map.put("10510", 10023);
        map.put("10511", 10024);
        map.put("10512", 10024);
        map.put("10513", 10024);
        map.put("10514", 10024);
        map.put("10515", 10024);
        map.put("10516", 10025);
        map.put("10517", 10025);
        map.put("10518", 10025);
        map.put("10519", 10025);
        map.put("10520", 10025);
        map.put("10522", 10521);
        map.put("10523", 10521);
        map.put("10524", 10521);
        map.put("10525", 10521);
        map.put("10527", 10526);
        map.put("10528", 10526);
        map.put("10529", 10526);
        map.put("10530", 10526);
        map.put("10532", 10531);
        map.put("10533", 10531);
        map.put("10534", 10531);
        map.put("10535", 10531);
        map.put("10537", 10536);
        map.put("10538", 10536);
        map.put("10539", 10536);
        map.put("10540", 10536);
        map.put("10542", 10543);
        map.put("10544", 10032);
        map.put("10545", 10032);
        map.put("10546", 10032);
        map.put("10548", 10549);
        map.put("10552", 10553);
        map.put("10555", 10040);
        map.put("10556", 10040);
        map.put("10557", 10040);
        map.put("10558", 10039);
        map.put("10559", 10039);
        map.put("10560", 10039);
        map.put("10561", 10039);
        map.put("10562", 10039);
        map.put("10563", 10039);
        map.put("10564", 10042);
        map.put("10565", 10042);
        map.put("10566", 10042);
        map.put("10567", 10042);
        map.put("10570", 10569);
        map.put("10571", 10569);
        map.put("10572", 10569);
        map.put("10573", 10569);
        map.put("10574", 10569);
        map.put("10575", 10569);
        map.put("10578", 10044);
        map.put("10579", 10045);
        map.put("10580", 10046);
        map.put("10581", 10047);
        map.put("10582", 10576);
        map.put("10583", 10577);
        map.put("10588", 10065);
        map.put("10589", 10065);
        map.put("10591", 10067);
        map.put("10592", 10067);
        map.put("10593", 10067);
        map.put("10594", 10067);
        map.put("10596", 10584);
        map.put("10597", 10584);
        map.put("10599", 10598);
        map.put("10603", 10752);
        map.put("10604", 10716);
        map.put("10605", 10007);
        map.put("10606", 10007);
        map.put("10607", 10288);
        map.put("10608", 10288);
        map.put("10609", 10288);
        map.put("10610", 10288);
        map.put("10611", 10068);
        map.put("10612", 10068);
        map.put("10613", 10068);
        map.put("10614", 10078);
        map.put("10615", 10078);
        map.put("10616", 10078);
        map.put("10617", 10078);
        map.put("10618", 10078);
        map.put("10619", 10078);
        map.put("10620", 10078);
        map.put("10621", 10078);
        map.put("10624", 10623);
        map.put("10626", 10073);
        map.put("10627", 10073);
        map.put("10628", 10074);
        map.put("10629", 10074);
        map.put("10630", 10710);
        map.put("10631", 10082);
        map.put("10632", 10082);
        map.put("10633", 10082);
        map.put("10634", 10082);
        map.put("10636", 10756);
        map.put("10637", 10756);
        map.put("10638", 10083);
        map.put("10639", 10083);
        map.put("10640", 10083);
        map.put("10641", 10083);
        map.put("10642", 10083);
        map.put("10643", 10083);
        map.put("10644", 10083);
        map.put("10645", 10083);
        map.put("10646", 10083);
        map.put("10647", 10083);
        map.put("10648", 10083);
        map.put("10649", 10083);
        map.put("10650", 10083);
        map.put("10651", 10083);
        map.put("10652", 10083);
        map.put("10653", 10083);
        map.put("10654", 10083);
        map.put("10655", 10083);
        map.put("10656", 10083);
        map.put("10657", 10083);
        map.put("10658", 10084);
        map.put("10659", 10085);
        map.put("10660", 10085);
        map.put("10661", 10085);
        map.put("10662", 10085);
        map.put("10663", 10085);
        map.put("10664", 10085);
        map.put("10665", 10088);
        map.put("10666", 10088);
        map.put("10667", 10090);
        map.put("10668", 10116);
        map.put("10669", 10116);
        map.put("10670", 10116);
        map.put("10671", 10116);
        map.put("10672", 10116);
        map.put("10673", 10116);
        map.put("10674", 10116);
        map.put("10675", 10116);
        map.put("10676", 10116);
        map.put("10677", 10116);
        map.put("10678", 10115);
        map.put("10679", 10115);
        map.put("10680", 10115);
        map.put("10681", 10115);
        map.put("10682", 10115);
        map.put("10683", 10115);
        map.put("10684", 10115);
        map.put("10685", 10115);
        map.put("10686", 10115);
        map.put("10687", 10115);
        map.put("10688", 10426);
        map.put("10689", 10094);
        map.put("10690", 10106);
        map.put("10691", 10106);
        map.put("10692", 10106);
        map.put("10693", 10106);
        map.put("10695", 10105);
        map.put("10696", 10105);
        map.put("10697", 10105);
        map.put("10700", 10965);
        map.put("10701", 10965);
        map.put("10703", 10702);
        map.put("10704", 10018);
        map.put("10705", 10521);
        map.put("10706", 10049);
        map.put("10707", 10584);
        map.put("10727", 10331);
        map.put("10734", 10598);
        map.put("10758", 10211);
        map.put("10970", 10747);
        map.put("10887", 10886);
        map.put("10897", 10893);
        map.put("10898", 10889);
        map.put("10892", 10886);
        map.put("10835", 11144);
        map.put("12200", 10770);

        PRODUCT_ID_MAPPING = Collections.unmodifiableMap(map);
    }


    /**
     * 获取新产品ID
     * @param oldProductId
     * @return
     */
    public static Integer getNewProductId(Integer oldProductId) {
        if (oldProductId == null) {
            return null;
        }

        Integer newProductId = PRODUCT_ID_MAPPING.get(oldProductId.toString());

        if (newProductId == null) {
            return oldProductId;
        }

        return newProductId;
    }

    /**
     * 获取默认产品ID
     * @return
     */
    public static int getDefaultProductId() {
        return OrderConsts.CHANNEL_DISABLED_PRODUCT_ID;
    }


    /**
     * 产品名称-Id映射(前端产品)
     */
    private static final Map<String, Integer> PRODUCT_NAME_ID_MAPPING = new HashMap<>();
    static {
        PRODUCT_NAME_ID_MAPPING.put("空调", 10763);
        PRODUCT_NAME_ID_MAPPING.put("冰箱", 10766);
        PRODUCT_NAME_ID_MAPPING.put("洗衣机", 10767);
        PRODUCT_NAME_ID_MAPPING.put("电视", 10768);
        PRODUCT_NAME_ID_MAPPING.put("热水器", 10769);
        PRODUCT_NAME_ID_MAPPING.put("燃气灶", 10772);
        PRODUCT_NAME_ID_MAPPING.put("油烟机", 10773);
        PRODUCT_NAME_ID_MAPPING.put("微波炉", 10774);
        PRODUCT_NAME_ID_MAPPING.put("饮水机", 10775);
    }

    /**
     * 通过产品名称查前台产品Id
     * @param productName
     * @return
     */
    public static int queryShowProductIdByName(String productName) {
        Pattern pattern = Pattern.compile("(空调|冰箱|洗衣机|电视|热水器|燃气灶|油烟机|微波炉|饮水机)");
        Matcher matcher = pattern.matcher(productName);
        if (matcher.find()) {
            String name = matcher.group(1);
            return PRODUCT_NAME_ID_MAPPING.get(name);
        }

        return getDefaultProductId();
    }

    /**
     * 私有构造器，防止外部初始化
     */
    private ProductIdUtil() {}

}
